<?php
namespace app\common\model;

// use think\Model;

class Role extends \app\common\model\Base
{




    //自定义初始化
    protected function initialize()
    {
        //需要调用`Model`的`initialize`方法
        parent::initialize();
        //TODO:自定义的初始化
        $list = $this->getColumn();
        $this->tree = new \com\Tree( $list  ,'id' ,'pid' ,  'name' , '-9' );

        // 不要在模块中 定义变量 会写入数据库的
        // 可以在修改的时候 使用  ->allowField(true) 过滤掉 数据中没有的字段
        // $this->model->allowField(true)->isUpdate(!!$data['id'])->validate(true)->save($data);
    }

    //系统支持自动写入创建和更新的时间戳字段
    // protected $autoWriteTimestamp = false;
    // 
    public $tree;

    //类型自动转换
    protected $type = [
        'id'    =>  'integer',
        'name'      =>  'string',
        'pid'     =>  'integer',
        'sort'  =>  'integer',
        'info'      =>  'string',   

    ];



    //关联表 用户 表1 : n 
    public function users()
    {
        // return $this->hasMany('Attach','id','id');
        return $this->belongsToMany('user','user_role','user_id','role_id');
    }






    // 数据完成
    protected $auto = array('name');
    // protected $insert = array('create_time'); 
    // protected $update = [];  
    
    //数据完成
    protected function setRuleAttr($value){
        return strtolower($value);
    }





    // 获取器  {$vo.place}
    public function getRolePlaceAttr($value,$data)
    {
        $id = $data['id'];

        $rs = $this->tree->getPos($id);
        $arr = array();
        foreach($rs as $v){
            $arr[] = $v['name'];
        }
        // if(count($arr) > 1 ){array_shift($arr);} //删除第一个
        return implode(' / ', $arr );
    }
    public function getPlaceAttr($value,$data){
      return $this->getRolePlaceAttr($value,$data);
    }

    // 获取器 {$vo.name}
    public function getRoleNameAttr($value,$data)
    {
        $id = $data['id'];
        $rs = $this->tree->get($id);
        return $rs['name'];
    }
    public function getUsersNameAttr($value ,$data ){
        
        $role = $this->find($data['id']);
        $names = array();
        foreach($role->users as  $user){
            $names[]=$user['username'];
        }
        $user_name = implode(',' , $names );
        return $user_name;
    }



    //
    //
    /**
     * 岗位（角色）删除 同时删除 关系表user_role数据
     * @param  [type] $id [description]
     * @return [type]     [description]
     */
    public function del($id)
    {
         $id = array_unique( (array)$id );

        if (empty($id)) {
            $this->error = '请选择要操作的数据!';
            return false;
        }

        $map = array('id' => array('in', $id));
        if( false === $this->where($map)->delete() ) {
             return false;
        }



        $map2 = array('role_id' => array('in', $id));
        if( false === model('user_role')->where( $map2 )->delete() ){
            return false;
        }


        return true;


    }


    /**
     * 获取 节点 给 ztree用 
     * @return [type] [description]
     */
    public function zNodes(){
        $rs =  $this->field('a.id ,   a.name , a.pid , b.name as pname ,a.id as place ,a.id as place ,a.id as users_name')
                    ->alias('a')
                    ->join('__ROLE__ b','a.pid = b.id','left')
                    ->order('a.`sort` asc ' )
                    ->select();



        // foreach ($rs as $k => $v) {
        //     $names = array();
        //     foreach($v->users as $kk => $vv){
        //         $names[]=$vv['username']
        //     }
        //     $v['user_name']
        // }

        return $rs;


    }

    public function getColumn(){
        return $this->order('sort asc,id asc')->column('*', 'id');


    }

    public function one($id){

            return  $this->field('a.* , b.name as pname')
                    ->alias('a')
                    ->join('__ROLE__ b','a.pid = b.id','left')
                    ->find($id);
    }

    /**
     * 添加 与 修改 
     * @return [type] [description]
     */
    public function change(){

        $data = array(
          'id'=>  input('post.id/d'),
          'name'=> input('post.name/s'), 
          'pid'=> input('post.pid/d'), 
          'sort'=> input('post.sort/d'), // 传入的是 是 下一个的id    0 代表最后一个
          'info'=> input('post.info/s'), 
        );

        //判断是否 pid合法性 ，pid 不能在 子id中 
        if( $data['id'] ){
             $ids = $this->tree->getIds(  $data['id']  );
             if($this->have( $ids , $data['pid'] )){
                $this->error =  '修改所在部门失败！！！' ; 
                return false;
             }
        }

        // 修改数据库
        $rs = $this
            ->data(  $data )  //为了 
            ->isUpdate( (bool) $data['id'] )  // 判断是添加还是删除
            ->validate( true )
            ->save(  $data ); //当有 validate 的时候 建议不要 在save中带入 $data    建议使用 ->data( $data )

        if( false === $rs  ){ return $rs ;}
        //修改后批量  更新排序
        $this->groupSort( $data  ); ///
        return true;


    }
    /**
     * 修改后批量  更新排序
     * @param  [array] $data  需要有 $data['pid']  &&  $data['id']  $data['sort']  
     * @return [type]       [description]
     */
    public function groupSort(  $data = null  ){


        // $row = $this->find($sort);

        // print_r($data);

        $arr = $this->field('id, pid')
        ->where('pid',$data['pid'])
        ->where('id' , '<>' , $data['id'])
        ->order('sort ASC')
        ->column(  'id' ); // 查询某一列的值

        if( ! $data['sort'] ){
            // 如果 sort= 0  代表 排序在最后
            array_push( $arr ,  $data['id'] );            
        }else{
           foreach( $arr as $k => $v ){
                if( $v ==  $data['sort'] ){
                    array_splice( $arr , $k , 0 , $data['id'] );
                    break;
                }
           } 
        }
        //根据 $arr 排序 修改排序  $k =  排序 ，  $v = id 
        foreach( $arr  as $k => $v ){
            $this->isUpdate(true)->where('id' , $v )->update(['sort' => $k+1 ]);



            // $this->isUpdate()->save(['sort' => $k ],['id' => $v]);
            // echo $this->getLastSql() , PHP_EOL;
        }

        

    }





    private function have($list,$item){
        return(strpos(',,'.$list.','  ,  ','.$item.','));
    }
    

    /**
     * 生成 option 标签
     * @param  [type]  $sid    选中id
     * @param  integer $rootid 跟节点pid
     * @return [type]          [description]
     */
    public function tree_options( $sid= null , $rootid = -9 ){
        dump($sid);
        $rs = $this->tree->get_tree_list( $rootid , $sid );
        $html = '';
        foreach($rs as $v){
            $html .= "<option value=\"{$v['id']}\" {$v['_selected']}> {$v['_prefix']} {$v['name']}  </option>".PHP_EOL;
        }
        return $html;
    }


    /**
     * 当前部门有节点 无法删除
     * @param  [type]  $id [description]
     * @return boolean     [description]
     */
    public function isAllowDelete( $id ){
        if( !empty(  $this->tree->getCC($id)  )){
            $this->error =  '存在子部门，无法删除！！！' ; 
            return false;
        }
        return true ;
    }

    /**
     * 岗位（角色）删除 同时删除 关系表user_role数据
     * @param  [type] $id [description]
     * @return [type]     [description]
     */
    public function del2($id)
    {
        $id = array_unique( (array)$id );
        //判断是否是空
        if (empty($id)) {
            $this->error = '请选择要操作的数据!';
            return false;
        }
        //判断允许删除不
        if (false === $this->isAllowDelete( $id ) ){
           
            $this->error = $this -> getError();
        }
        
        //部门表删除 同时删除 岗位（ 角色）表数据 多表关联查询删除 好牛逼呀 需要 修改 tp db/Builder.php文件 。
        if(false ===  $rs = db('user_role')->alias('a')->field('a,b')->join('__ROLE__ b','b.id = a.role_id')
                                      ->where(['b.id'=>['in',$id]])
                                      //->fetchSql(true)
                                      ->delete() ){

          return  false;
        }




        return true;


    } 

}